// 组合子模块
// 封装统一导出的供业务使用的方法

import { createContext, useContext } from "react";
import { ListStore } from "./listsStoreModule";
import { CountStore } from "./countStoreModule";

// 1、声明一个 RootStore
class RootStore {
  constructor() {
    // 对子模块进行实例化
    // 将来实例化根 store 的时候
    // 根 store 有两个属性，分别是 countStore 和 listStore
    // 各自对应的值，就是我们导入的子模块实例对象
    this.listStore = new ListStore()
    this.countStore = new CountStore()
  }
}

// 实例化操作（固定封装模式，每个项目都是这样）
const rootStore = new RootStore()
// 使用 react 的 context 机制，完成统一的方法封装
// 解析：
// 之前使用的是利用 Provider value={传递的值} 来包裹根组件来传递值
// 这里没有使用 Provider ，是因为 context 的查找机制
// 查找机制：useContext 优先从 Provider 上的 value 查找，如果查找不到，就会在 createContext() 的括号中取值
const Context = createContext(rootStore)
// 这个方法的作用：通过 useContext 拿到 rootStore 实例对象，然后返回
// 只要在业务组件中，调用 useStore()，就可以得到 rootStore
const useStore = () => {
  return useContext(Context)
}

export default useStore